#pragma once
#include <unordered_map>
#include <string>
#include "block_queue.hpp"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "api.hpp"
typedef struct sockaddr sockaddr;
typedef struct sockaddr_in sockaddr_in;

namespace server
{

  struct Context{
    std::string str;
    sockaddr_in addr;
  };

  class ChatServer
  {
  public:
    //启动服务器
    int Start(const std::string& ip,short port);
    //接收消息
    int RecvMsg();
    //广播消息
    int BoardCast();
  private:
    //将生产者和消费者的线程入口函数声明成静态的
    //是因为在创建线程时无法将非静态成员进行传参
    static void* Product(void*);
    static void* Consume(void*);

    //加入用户
    void AddUser(sockaddr_in addr,const std::string& name);
    //删除用户
    void DelUser(sockaddr_in addr,const std::string& name);
    //发送消息
    void SendMsg(const std::string& data,sockaddr_in addr);

    //在线好友列表，用hash表来保存，方便插入和删除
    //key:用户的身份标识（ip+昵称）
    //value:ip+端口号（sockaddr_inck）
    std::unordered_map<std::string,sockaddr_in> online_friend_list;
    //使用一个阻塞消息队列作为生产者消费者模型的交易场所
    //暂定队列中元素类型为std::string
    BlockQueue<Context> msg_queue;
    //服务器进行绑定的文件描述符
    int sock;
  };
}//end server
